package com.proyecto.personas.modelo.servicio;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.exception.ConstraintViolationException;

import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.personas.modelo.dto.Direcciones;

public class ServicioDirecciones extends ServicioGenerico {

	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion)
			throws GeneralException {
		
		if (isValidacionActiva()){
			validacion.incluir(pojo);
		}
		
		try{
				((Direcciones)pojo).getId().setDireccioncod(this.obtenerProximoNumero());
				super.incluir(pojo, iniciaTransaccion);
		
			} catch (org.springframework.dao.DataIntegrityViolationException e) {
				
				if (e.getMostSpecificCause() instanceof org.hibernate.PropertyValueException) {
					throw new GeneralException(
							"advertencia." + claveProperties + ".incluir.datoRequeridoVacio");
				} else if (e.getMostSpecificCause() instanceof ConstraintViolationException) {
					throw new GeneralException(
							"advertencia." + claveProperties + ".incluir.registroDuplicado");
				}
				throw new GeneralException("error." + claveProperties + ".incluir");

			} catch (org.springframework.dao.DataAccessResourceFailureException e) {
				
				if (e.getMostSpecificCause() instanceof org.hibernate.exception.JDBCConnectionException) {
					throw new GeneralException(
							"error." + claveProperties + ".conexion");
				}
				throw new GeneralException("error." + claveProperties + ".incluir");
			} catch (Exception e) {
				System.err.println(":::ServicioDirecciones::: " + e.getMessage());
				if("advertencia.persona.datosBasicos.direcciones.modificar.BloqueoOptimista".equals(e.getMessage())){
					throw new GeneralException(	e.getMessage());
				}else{
					throw new GeneralException(
							"error." + claveProperties + ".desconocido");
				}
				
			}
	}
	
	public Direcciones obtenerDireccion(String ciaOpr, Integer nroPersona, String dirtipocod){
		Direcciones direccion = null;
		try {
			String queryString = "FROM Direcciones tabla WHERE tabla.id.ciaopr='" + ciaOpr + "'" +
									" and tabla.id.nropersona = " + nroPersona.toString() +
									" and tabla.dirtipocod = '" + dirtipocod + "'";
			List direcciones = propiedadDAO.ejecutarQueryConsulta(queryString);
			direccion = (Direcciones) direcciones.get(0); 
		} catch (Exception e) {
			
		}
		
		return direccion;
	}
	
	public boolean buscarDirPrincipal(String ciaOpr, Integer nroPersona){
		List<Direcciones> direccion = null;

		try {
			String queryString = "FROM Direcciones tabla WHERE tabla.id.ciaopr='" + ciaOpr + "'" +
									" and tabla.id.nropersona = " + nroPersona.toString() +
									" and tabla.dirtipocod = 'PRI' ";
			direccion = propiedadDAO.ejecutarQueryConsulta(queryString);
			//direccion = (Direcciones) direcciones.get(0);
			
			if(direccion != null && direccion.size() > 0 ){
				return true;
			}else{
				return false;
			}
		} catch (Exception e) {
			return false;
		}
		
	}

	public boolean buscarDirCambio(String ciaOpr, Integer nroPersona){
		List<Direcciones> direccion = null;

		try {
			String queryString = "FROM Direcciones tabla WHERE tabla.id.ciaopr='" + ciaOpr + "'" +
									" and tabla.id.nropersona = " + nroPersona.toString() +
									" and tabla.dirtipocod = 'CMB' ";
			direccion = propiedadDAO.ejecutarQueryConsulta(queryString);
			//direccion = (Direcciones) direcciones.get(0);
			
			if(direccion != null && direccion.size() > 0 ){
				return true;
			}else{
				return false;
			}
		} catch (Exception e) {
			return false;
		}
		
	}
	
	public boolean buscarDir_xTipo(String ciaOpr, Integer nroPersona, String dirtipocod){
		List<Direcciones> direccion = null;

		try {
			String queryString = "FROM Direcciones tabla WHERE tabla.id.ciaopr='" + ciaOpr + "'" +
									" and tabla.id.nropersona = " + nroPersona.toString() +
									" and tabla.dirtipocod = '" + dirtipocod + "' ";
			
			direccion = propiedadDAO.ejecutarQueryConsulta(queryString);
			//direccion = (Direcciones) direcciones.get(0);
			
			if(direccion != null && direccion.size() > 0 ){
				return true;
			}else{
				return false;
			}
		} catch (Exception e) {
			return false;
		}
		
	}
	private String obtenerProximoNumero(){
		List ultimo = null;
		
		Integer ultimoNumero;
		try {
			String queryString = "SELECT MAX(cast(P.id.direccioncod as int)) FROM Direcciones P";
			ultimo = propiedadDAO.ejecutarQueryConsulta(queryString);
			
		} catch (RuntimeException re) {
			throw re;
		}
		
		if (ultimo.get(0) != null){
			ultimoNumero = Integer.parseInt(ultimo.get(0).toString()) + 1;
		} else {
			ultimoNumero = 1;
		}

		return ultimoNumero.toString();
	}
	
	public String retornarDireccionCortica(String ciaopr, Integer nropersona, String tipoDir){
			
		String dirCortica = "";
		Direcciones objDirecciones = null;
		
		objDirecciones = obtenerDireccion(ciaopr,nropersona, tipoDir);
		dirCortica = objDirecciones.funcionDireccionCortica();
		return dirCortica;
	}
	
	public String retornarDireccionCompleta(String ciaopr, Integer nropersona, String tipoDir){
		String dirCompleta = "";
		Direcciones objDirecciones = null;
		
		objDirecciones = obtenerDireccion(ciaopr,nropersona, tipoDir);
		
		dirCompleta = objDirecciones.funcionDireccionCompleta();
		return dirCompleta;
		
		/*
		dirCompleta = (objDirecciones.getTipzonacod() == null || "".equals(objDirecciones.getTipzonacod() )
						? ""
						: objDirecciones.getTiposZonas().getTipzonanombre()
						) +
						(objDirecciones.getTipzonaref() == null || "".equals(objDirecciones.getTipzonaref() )
						? ""
						: " " + objDirecciones.getTipzonaref()
						) +
						(objDirecciones.getTipedifcod() == null || "".equals(objDirecciones.getTipedifcod() )
						? ""
						: ", " + objDirecciones.getTiposEdificacion().getTipedifnombre()
						) +
						(objDirecciones.getTipedifref() == null || "".equals(objDirecciones.getTipedifref())
						? ""
						: " " + objDirecciones.getTipedifref()
						);
		
		armaDireccion2 = (objDirecciones.getLocalidadcod() == null || "".equals(objDirecciones.getLocalidadcod() )
							? ""
							: objDirecciones.getLocalidad().getLocalidadayudabusq()
						);
		*/
		
	}
	

	public List<Direcciones> buscarObjDirecciones(Integer nropersona){
		List<Direcciones> listDirecciones = null;
		
		String query = "FROM Direcciones dir " +
						" WHERE dir.id.nropersona = " + nropersona;


		try {
			listDirecciones = propiedadDAO.ejecutarQueryConsulta(query, null);	
		} catch (Exception e) {
			// 		TODO: handle exception
			listDirecciones = new ArrayList<Direcciones>();
		}
		
		return listDirecciones;
	}
	
}
